let str: string = "str"
let num: number = 100
let flag: boolean = true

let und: undefined = undefined
let nulls: null = null

// 联合类型
let ipt: string | number = "sssss"
let val: string | number = "vvvvvv"

// 任意类型
let anys: any = "any"

// 类型别名
type sn = string | number

let ipt2: sn = 123




// 接口 约束对象类型
interface IUserInfo {
    userName: string,
    passWord: number,
    rem?: boolean
}

interface IUserInfo2 {
    address: string
}

type abc = IUserInfo & IUserInfo2


let userInfo: abc = {
    userName: "wang",
    passWord: 123456,
    rem: true,
    address: '北京'
}




// 枚举  在已知的范围中选取其中一个
// 两种写法
// enum Car {
//     Up,
//     Down,
//     Left,
//     Right
// }

// enum Car {
//     Up = "up",
//     Down = "down",
//     Left = "left",
//     Right = "right"
// }

// console.log(Car)





// 数组  里面的每一项类型都是一样的
// let arr: number[] = [1, 2, 3, 4, 5]
// let arr: Array<number> = [1, 2, 3, 4]


// 元组
// let arr2: [number, string, boolean] = [111, "str", false]




// 泛型
// function echo(arg) {
//     return arg
// }


// function echo<T>(arg: T): T {
//     return arg
// }

// const res = echo('strrr')



// function echo<T, U, I>(arg: T, num: U, flag: I) {
//     return arg
// }

// const res = echo('strrr', 10000, true)


// 约束性泛型
interface ILength {
    length?: number,
    push: any
}


function echo<T extends ILength>(list: T): T {
    list.push(6)
    return list
}

// const res = echo([1, 2, 3])




// 返回为空 

// function add(arg: string): string {
   
// }

